c语言:进制和位运算
以 10 为例,不同进制的表示方法:
十进制: 10;
二进制: 0b1010;
八进制: 010;
十六进制: 0x10;
int a = 100;
printf("%o",a);
/*
如何输出进制数:
%d ------ 十进制
%o ------ 八进制
%0x ----- 十六进制
*/
/*
位运算符:按位与 &, 按位或 |, 按位非 ~, 按位异或 ^, 左移 <<, 右移 >>
按位与 & : 同1 为 1,否则为 0,经常用于对某一位清零.
按位或 | : 同0 为 0,否则为1.经常用于保留某一位,
按位非 ~ : 如果是一个有符号的数,则最高位代表符号位,1 代表负数, 0 代表正数,
数据在内存中存储时,是以补码的形式存储的,正数的补码是本身,负数的补码是 绝对值 取反 加 1 .
按位异或 ^ : 相同为 0,不同为 1 ;
*/
左移 << :
unsigned char d = 1;
printf("%d",d << 4);
右移 >>
unsigned char a = 255;
printf("%d",a >> 1);
unsigned char number = 0b01100100;
unsigned char left = number << 4;
unsigned char right = number >> 4;
unsigned char result = left | right;
printf("%d",result);
/*
//将 10010010 奇偶位互换
unsigned char num = 0b10010010;
//清零操作使用 按位&, 保留的位数为 1 ,清 0 数位为 0 ;
//1.将奇数位变偶数位,左移一位
unsigned char left = num << 1;
//2.保留偶数位,奇数位清 0
unsigned char clearJi = left & 10101010;
//3.将偶数位变奇数位,右移一位
unsigned char right = num >> 1;
//4.保留奇数位偶数位清0
unsigned char clearOu = right & 01010101;
//5.最后按位或 |
unsigned char result = clearJi | clearOu;
printf("%d",result);
*/
/*
数据类型的取值范围:
无符号: char 类型 0 -- 255 (2 的8次方 - 1);
short 0 -- 2的16次方 - 1;
int 0 -- 2的32次方 - 1;
有符号: char -2 的 7次方 -- 2 的7次方 - 1;
short -2 的15次方 -- 2 的15次方 - 1;
int -2 的31次方 -- 2 的31次方 - 1;
*/
char b = ~4;
int a = 5 ^ 7;
printf("%d",b);
//栈区内存分配原则: 由高到低分配, 由低到高存取.
int a = -5;
printf("%p\n",&a);
int b = 10;
printf("%p\n",&b);
//数组名代表数组的首地址,也就是数组的第一个元素地址,是一个常量地址
int a[4] = {1, 2, 3, 4};
printf("%d\n", &a[0]);
printf("%p\n", &a[1]);
printf("%p\n", &a[2]);
printf("%p\n", &a[3]);
printf("%p\n", &a);
//交换两个数的值 不借助第三方变量
int a = 20;//1001
int b = 36;//0101
printf("交换前 a = %d,b = %d\n",a, b);
a = a ^ b;//1100
b = b ^ a;//1001
a = a ^ b;//0101
printf("交换后 a = %d,b = %d\n",a, b);